package gov.nist.applet.phone.media.messaging;

import java.awt.AWTException;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FileDialog;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.awt.image.BufferedImage;
import java.awt.image.RescaleOp;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

/**
 * java截屏 运行后将当前屏幕截取，并最大化显示。 拖拽鼠标，选择自己需要的部分。 按Esc键保存图片到桌面，并退出程序。
 * 点击右上角（没有可见的按钮），退出程序，不保存图片。
 * 
 * @author JinCeon
 */
public class CaptureScreen extends JFrame
{

	private static final long serialVersionUID = 1L;
	int orgx, orgy, endx, endy;
	Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
	BufferedImage image;
	BufferedImage tempImage;
	BufferedImage saveImage;
	Graphics g;
	
	private JButton save;
	private JButton cancel;
	private JButton exit;

	@Override
	public void paint(Graphics g)
	{
		RescaleOp ro = new RescaleOp(0.8f, 0, null);
		tempImage = ro.filter(image, null);
		g.drawImage(tempImage, 0, 0, this);
	}

	
	public CaptureScreen()
	{
		snapshot();
		setVisible(true);
		setSize(d);// 最大化窗口
//		MyActionListener actionListener = new MyActionListener();
//	    
//		save = new JButton("保存");
//	    save.addActionListener(actionListener);
//	    jPanel1.add(save);
//	   
//	    cancel = new JButton("取消");
//	    cancel.addActionListener(actionListener);
//	    jPanel1.add(cancel);
//	    
//	    exit = new JButton("退出");
//	    exit.addActionListener(actionListener);
//	    jPanel1.add(exit);

		setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		this.addMouseListener(new MouseAdapter()
		{
			public void mousePressed(MouseEvent e)
			{
				orgx = e.getX();
				orgy = e.getY();
			}
		});
		this.addMouseMotionListener(new MouseMotionAdapter()
		{
			public void mouseDragged(MouseEvent e)
			{
				endx = e.getX();
				endy = e.getY();
				g = getGraphics();
				g.drawImage(tempImage, 0, 0, null);
				int x = Math.min(orgx, endx);
				int y = Math.min(orgy, endy);
				int width = Math.abs(endx - orgx) + 1;
				int height = Math.abs(endy - orgy) + 1;
				// 加上1，防止width或height为0
				g.setColor(Color.BLUE);
				g.drawRect(x - 1, y - 1, width + 1, height + 1);
				// 减1，加1都是为了防止图片将矩形框覆盖掉
				saveImage = image.getSubimage(x, y, width, height);
				g.drawImage(saveImage, x, y, null);
			}

		});
		this.addKeyListener(new KeyAdapter()
		{
			@Override
			public void keyReleased(KeyEvent e)
			{
				// 按Esc键退出
				if (e.getKeyCode() == KeyEvent.VK_ESCAPE)
				{
					saveToFile();
					CaptureScreen.this.setVisible(false);
					CaptureScreen.this.dispose();
				}
			}
		});

	}
	
	class MyActionListener implements ActionListener
	{
		public void actionPerformed(ActionEvent e)
		{
			JButton buttonName = (JButton) e.getSource();
			
			if(save.equals(buttonName))
				saveToFile();
			else if(cancel.equals(buttonName))
				System.out.println("do nothing");
			else if(exit.equals(buttonName))
			{
				CaptureScreen.this.setVisible(false);
				CaptureScreen.this.dispose();
			}
		}
	}

	public void saveToFile()
	{
		SimpleDateFormat sdf = new SimpleDateFormat("yyyymmddHHmmss");
		String name = sdf.format(new Date());
		// File path = FileSystemView.getFileSystemView().getHomeDirectory();
		String format = "jpg";
		FileDialog fileDialog = new FileDialog(this,"保存图像文件", FileDialog.SAVE);

		fileDialog.setVisible(true);
		String directory = fileDialog.getDirectory();
		String path = directory;
		System.out.println("save picture to " + path);
		File f = new File(path + File.separator + name + "." + format);
		try
		{
			ImageIO.write(saveImage, format, f);
		} catch (IOException e)
		{
			e.printStackTrace();
		}

	}

	public void snapshot()
	{
		try
		{
			Robot robot = new Robot();
			Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
			image = robot.createScreenCapture(new Rectangle(0, 0, d.width,
					d.height));
		} catch (AWTException e)
		{
			e.printStackTrace();
		}
	}

	public static void main(String[] args)
	{
		CaptureScreen capture = new CaptureScreen();

	}
}
